package com.xsd.principle.ocp;

/**
 * @Description: 反面示例
 * @Author: zhoufuzong
 * @Created: 2021-01-17 15:16:32
 * @Version: 1.1.0
 */

/*
方式1的改进的思路分析
改进的思路分析
思路：把创建Shape类做成抽象类，并提供一个抽象的draw方法，让子类去实现即可，
这样我们有新的图形种类时，只需要让新的图形类继承Shape，并实现draw方法即可，
使用方的代码就不需要修 -> 满足了开闭原则
 */

public class Ocp1 {
    public static void main(String[] args) {
        //使用看看存在的问题
        GraphicEditor graphicEditor = new GraphicEditor();
        graphicEditor.drawShape(new Rectangle());
        graphicEditor.drawShape(new Circle());
        graphicEditor.drawShape(new Triangle());
    }

}

//这是一个用于绘图的类 [使用方]
class GraphicEditor1 {
    //接收Shape对象，然后根据type，来绘制不同的图形
    public void drawShape(Shape s) {
        if (s.m_type == 1)
            drawRectangle(s);
        else if (s.m_type == 2)
            drawCircle(s);
        else if (s.m_type == 3)
            drawTriangle(s);

        // 每新增一个图形，使用方的代码需要增加一层else if
        // 违背 开闭原则中 对修改关闭(对使用方）
    }

    //绘制矩形
    public void drawRectangle(Shape r) {
        System.out.println(" 绘制矩形 ");
    }

    //绘制圆形
    public void drawCircle(Shape r) {
        System.out.println(" 绘制圆形 ");
    }

    //绘制三角形
    public void drawTriangle(Shape r) {
        System.out.println(" 绘制三角形 ");
    }
}

//Shape类，基类
class Shape1 {
    int m_type;
}

class Rectangle1 extends Shape1 {
    Rectangle1() {
        super.m_type = 1;
    }
}

class Circle1 extends Shape1 {
    Circle1() {
        super.m_type = 2;
    }
}

//新增画三角形
class Triangle1 extends Shape1 {
    Triangle1() {
        super.m_type = 3;
    }
}
